Разрешения
----------

### Базовые разрешения

```cpp
enum class BasePermission : unsigned
{
    None                = 0b00000000, // Нет разрешений.
    FullAdmin           = 0b00000001, // Администратор системы (полный доступ).
    DaysCorrector       = 0b00000010, // Доступ к изменению календаря.
    UserCorrector       = 0b00000100, // Доступ к изменению пользователей.
    WorkflowCorrector   = 0b00001000, // Доступ к изменению рабочих процессов.
    BoardCorrector      = 0b00010000, // Доступ к изменению досок.
    ProjectCorrector    = 0b00100000, // Доступ к изменению проектов/этапов.
    PlanCorrector       = 0b01000000, // Доступ к планированию.
};
```

--------------------------------------------------------------------------------

### Разрешения

```cpp
enum class Permission : unsigned
{
    None  = 0b00000000, // Нет разрешений.
    Read  = 0b00000001, // Чтение.
    Write = 0b00000010, // Запись.
};
```

Permission назначаются как свойства правил роли.

+ RuleState -- Доступ к элементам (item) в указанном состоянии.
+ RuleProject -- Доступ к элементам (item) в рамках проекта.
+ RuleItemType -- Доступ к элементам (item) указанного типа.

--------------------------------------------------------------------------------

### Доступ к элементам 

В данном разделе представлен перечень правил для предоставления доступа
к экземплярам элементов со стороны службы доступа к данным.

--------------------------------------------------------------------------------

#### Календарь

`StandardDay и SpecialDay`

##### Чтение

+ Все.

##### Запись

+ FullAdmin;

+ DaysCorrector.

--------------------------------------------------------------------------------

#### Календарь пользователя

`UserDay`

##### Чтение

+ FullAdmin;

+ DaysCorrector;

+ Пользователь, чей это день.

##### Запись

+ FullAdmin;

+ DaysCorrector.

--------------------------------------------------------------------------------

#### Права и правила

`Rule, RuleState, RuleItemType, RuleProject`

##### Чтение

+ Все.

##### Запись

+ FullAdmin;

+ UserCorrector.

--------------------------------------------------------------------------------

#### Пользователи, группы, роли

`User, Team, Role, UserTeamRole, ProjectTeam, RoleMenuItem`

##### Чтение

+ Все.

##### Запись

+ FullAdmin;

+ UserCorrector.

--------------------------------------------------------------------------------

#### Рабочий процесс

`Workflow, State, Edge`

##### Чтение

+ Все.

##### Запись

+ FullAdmin;

+ WorkflowCorrector.

--------------------------------------------------------------------------------

#### Классы предметной области

`ItemType, FieldType, FieldTypePossibleValue, LinkType`

##### Чтение

+ Все.

##### Запись

+ FullAdmin;

+ WorkflowCorrector.

--------------------------------------------------------------------------------

#### Доски

`Board, BoardColumn`

##### Чтение

+ FullAdmin;

+ BoardCorrector;

+ Все (возможно стоит ограничить).

##### Запись

+ FullAdmin;

+ BoardCorrector.

--------------------------------------------------------------------------------

#### Планирование

`ItemPlan`

##### Чтение

+ FullAdmin;

+ PlanCorrector;

+ Пользователь, чей это план.

##### Запись

+ FullAdmin;

+ PlanCorrector.

--------------------------------------------------------------------------------

#### Проекты и этапы

`Project, Phase`

##### Чтение

+ FullAdmin;

+ ProjectCorrector;

+ Пользователь, где роль содержит условие: в RuleProject есть идентификатор
проекта и разрешение на чтение.

##### Запись

+ FullAdmin;

+ ProjectCorrector.

--------------------------------------------------------------------------------

#### Объекты предметной области

`Item, ItemField, ItemLink, ItemDocumentVersion`

##### Чтение

+ FullAdmin;

+ Пользователь, где роль содержит все условия:
    * в RuleProject есть идентификатор проекта, куда входит Item и разрешение
    на чтение;
    * в RuleItemType есть идентификатор типа Item и разрешение на чтение;
    * в RuleState есть идентификатор состояния, в котором находится Item.

##### Запись

+ FullAdmin;

+ Пользователь, где роль содержит все условия:
    * в RuleProject есть идентификатор проекта, куда входит Item и разрешение
    на запись;
    * в RuleItemType есть идентификатор типа Item и разрешение на запись;
    * в RuleState есть идентификатор состояния, в котором будет Item после
    внесения изменений.

--------------------------------------------------------------------------------

#### История изменений

`ItemUserState, ItemHistory`

##### Чтение

+ FullAdmin;

+ Пользователь, где роль содержит все условия:
    * в RuleProject есть идентификатор проекта, куда входит Item и разрешение
    на чтение;
    * в RuleItemType есть идентификатор типа Item и разрешение на чтение;
    * в RuleState есть идентификатор состояния, в котором находится Item.

##### Запись (только создание новых записей)

+ Пользователь, где роль содержит все условия:
    * в RuleProject есть идентификатор проекта, куда входит Item и разрешение
    на запись;
    * в RuleItemType есть идентификатор типа Item и разрешение на запись;
    * в RuleState есть идентификатор состояния, в котором будет Item после
    внесения изменений.

--------------------------------------------------------------------------------

#### Личное сообщение

`PrivateMessage`

##### Чтение

+ Пользователь отправитель;
+ Пользователь получатель.

##### Запись (только создание новых записей)

+ Пользователь отправитель.

--------------------------------------------------------------------------------

#### Групповое сообщение

`TeamMessage`

##### Чтение

+ Пользователь отправитель;
+ Пользователь, состоящий в команде получателей.

##### Запись (только создание новых записей)

+ Пользователь отправитель.

--------------------------------------------------------------------------------

#### Комментарии

`Comment, CommentDocumentVersion`

##### Чтение

+ FullAdmin;

+ Пользователь, где роль содержит все условия:
    * в RuleProject есть идентификатор проекта, куда входит Item и разрешение
    на чтение;
    * в RuleItemType есть идентификатор типа Item и разрешение на чтение;
    * в RuleState есть идентификатор состояния, в котором находится Item.

##### Запись (только создание новых записей)

+ FullAdmin;

+ Пользователь, где роль содержит все условия:
    * в RuleProject есть идентификатор проекта, куда входит Item и разрешение
    на чтение;
    * в RuleItemType есть идентификатор типа Item и разрешение на чтение;
    * в RuleState есть идентификатор состояния, в котором находится Item.

##### Запись (изменение/удаление записей)

+ FullAdmin;

+ Пользователь создатель записи.

--------------------------------------------------------------------------------

#### Документ

`Document, DocumentVersion`

##### Чтение

+ FullAdmin;

+ Пользователь, с доступом на чтение к ItemDocumentVersion;

+ Пользователь, с доступом на чтение к CommentDocumentVersion.

##### Запись

+ FullAdmin;

+ Пользователь, с доступом на запись к ItemDocumentVersion;

+ Пользователь, с доступом на запись к CommentDocumentVersion.
